package pe.com.empresa.web.actions.movimientos;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import pe.com.empresa.datos.dao.ArticuloMapper;
import pe.com.empresa.datos.dominio.Articulo;
import pe.com.empresa.datos.dominio.ArticuloExample;
import pe.com.empresa.datos.dominio.ConsultaBuscarArticulos;
import pe.com.empresa.datos.dominio.ConsultaBuscarArticulosCriteria;
import pe.com.empresa.datos.dominio.ConsultaListaKardexPorArticulo;
import pe.com.empresa.datos.dominio.ConsultaListaKardexPorArticuloCriteria;
import pe.com.empresa.utiles.ActionHelper;
import pe.com.empresa.utiles.Constantes;
import pe.com.empresa.utiles.GrillaArticulos;
import pe.com.empresa.utiles.KardexUtil;
import pe.com.empresa.utiles.ServiceHelper;

public class BuscarExistenciasAction extends ActionHelper {

	private static final long serialVersionUID = -5631641269470168969L;

	private String nombre;
	private ServiceHelper service = new ServiceHelper();
	private String stringJson;
	
	
	public BuscarExistenciasAction() {
		service.setSqlSessionFactory(this.getSqlSessionFactory());
	}
	
	public String formBuscarExistencias(){
		return SUCCESS;
	}
	
	@SuppressWarnings("unchecked")
	public String buscarExistencia(){
		

		try {
			
			service.openSession();
			
			System.out.println("nombre articulo: "+this.nombre);
			
			List<GrillaArticulos> grilla = new ArrayList<GrillaArticulos>();
			
			ConsultaBuscarArticulosCriteria criteriaArticulos = new ConsultaBuscarArticulosCriteria();
			criteriaArticulos.setNombreArticulo(this.nombre);
			List<ConsultaBuscarArticulos> list = service.selectByCriteria("ConsultaBuscarArticulos", "consultaBuscarArticulosSimple", criteriaArticulos);
			
			System.out.println("lista articulos: "+list);
			
			for(ConsultaBuscarArticulos x : list){
				ConsultaListaKardexPorArticuloCriteria criteria = new ConsultaListaKardexPorArticuloCriteria();
				criteria.setCodigoArticulo(x.getCodigoArticulo());
				List<ConsultaListaKardexPorArticulo> listKardex = service.selectByCriteria("ConsultaListaKardexPorArticulo", criteria);
				if(!listKardex.isEmpty()){
					List<KardexUtil> listaSaldos = this.calcularSaldos(listKardex);
					System.out.println(listaSaldos);
					KardexUtil ultimoSaldo = listaSaldos.get(listaSaldos.size()-1);
					GrillaArticulos articulo = new GrillaArticulos();
					articulo.setCodigoArticulo(ultimoSaldo.getCodigoArticulo());
					articulo.setDescripArticulo(x.getNombreArticulo());
					articulo.setPrecio(new BigDecimal(x.getPrecioVenta()));
					articulo.setExistencia(ultimoSaldo.getCantidadArticuloExistencia());
					if(ultimoSaldo.getCantidadArticuloExistencia().intValue() > 0){
						grilla.add(articulo);
					}
					
				}
				
			}
			
			stringJson = toListJson(grilla);
			
			System.out.println("-------------------------------------------------------------");
			System.out.println(stringJson);
			System.out.println("-------------------------------------------------------------");
			
			
			service.closeSession();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return SUCCESS;
	}
		
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getStringJson() {
		return stringJson;
	}
	public void setStringJson(String stringJson) {
		this.stringJson = stringJson;
	}
	
	
	public List<KardexUtil> calcularSaldos(List<ConsultaListaKardexPorArticulo> list){
		List<KardexUtil> listKardexUtil = new ArrayList<KardexUtil>(); 
		
		for(ConsultaListaKardexPorArticulo k : list){
			
			KardexUtil kardex = new KardexUtil();
				
			kardex.setCodigoArticulo(k.getCodigoArticulo());
			
			
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_ENTRADA_COMPRA)){
				
				kardex.setCantidadArticuloEntrada(k.getCantidadArticulo());
				kardex.setValorUnitarioEntrada(k.getValorUnitario());
				kardex.setValorTotalEntrada(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo().intValue() + util.getCantidadArticuloExistencia().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() + kardex.getValorTotalEntrada().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
				
			}
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_ENTRADA_DEVOLUCION)){
				
				kardex.setCantidadArticuloEntrada(k.getCantidadArticulo().intValue());
				kardex.setValorUnitarioEntrada(k.getValorUnitario());
				kardex.setValorTotalEntrada(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo().intValue() + util.getCantidadArticuloExistencia().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() + kardex.getValorTotalEntrada().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
			}
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_SALIDA_VENTA)){
				
				kardex.setCantidadArticuloSalida(k.getCantidadArticulo());
				kardex.setValorUnitarioSalida(k.getValorUnitario());
				kardex.setValorTotalSalida(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(util.getCantidadArticuloExistencia().intValue() - k.getCantidadArticulo().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() - kardex.getValorTotalSalida().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
			}
			if(k.getTipo_movimiento().equals(Constantes.TIPO_MOVIMIENTO_SALIDA_DEVOLUCION)){
				
				kardex.setCantidadArticuloSalida(k.getCantidadArticulo().intValue());
				kardex.setValorUnitarioSalida(k.getValorUnitario());
				kardex.setValorTotalSalida(new BigDecimal(kardex.getCantidadArticuloSalida().intValue() * k.getValorUnitario().doubleValue()));
				
				if(listKardexUtil.isEmpty()){

					kardex.setCantidadArticuloExistencia(k.getCantidadArticulo());
					kardex.setValorUnitarioExistencia(k.getValorUnitario());
					kardex.setValorTotalExistencia(new BigDecimal(k.getCantidadArticulo().intValue() * k.getValorUnitario().doubleValue()));
					
				}else{
					
					int index = listKardexUtil.size() - 1;
					KardexUtil util = listKardexUtil.get(index);
					
					kardex.setCantidadArticuloExistencia(util.getCantidadArticuloExistencia().intValue() - k.getCantidadArticulo().intValue());
					kardex.setValorTotalExistencia(new BigDecimal(util.getValorTotalExistencia().doubleValue() - kardex.getValorTotalSalida().doubleValue()));
					BigDecimal	valor = null;
					if(kardex.getValorTotalExistencia().doubleValue() == 0  && kardex.getCantidadArticuloExistencia().doubleValue() == 0){
						valor = new BigDecimal(0);
					}else{
						valor = new BigDecimal(kardex.getValorTotalExistencia().doubleValue() / kardex.getCantidadArticuloExistencia().doubleValue());
					}
					kardex.setValorUnitarioExistencia(valor);
					
				}
				
			}
			kardex.setTipo_movimiento(k.getTipo_movimiento());
			listKardexUtil.add(kardex);
			
		}
		return listKardexUtil;
	}
	
}
